TCP/IP协议栈指纹有哪些探测方法
TCP/IP协议栈指纹有以下探测方法:
FIN标志位探测:按照RFC793的规定,主机上开放的端口对到达的FIN标志位设置为1的TCP数据包通常不响应。但是Windows、CISCO、HP/UX及IRIX等操作系统会返回一个RST标志位设置为1的TCP数据包。
BOGUS标记探测:如果在SYN包的TCP头部里设置一个未定义的TCP“标记”(64或128),并向远程目标主机发送这个数据包,某些操作系统,如Linux 2.0.35以前的版本等返回的数据包中就会保持这个未定义的标记,而其他一些系统收到SYN+BOGUS包后将关闭连接,利用这些特性可以识别一些操作系统。
TCP ISN取样:ISN是初始化序号,即TCP通信的任何一方在TCP连接建立时发出的第一个TCP报文的序号字段。这种操作系统检测方法需要收集目标操作系统的ISN信息,通常会向目标主机系统多次发送TCP连接请求,相应收集目标系统的连接响应并对其中的ISN信息进行分析。一些操作系统的ISN是随机增长的,如Solaris、IRIX和FreeBSD等,还有一些操作系统的ISN与时间相关,每经过一段时间ISN的值会有一个固定的增长,也有操作系统的ISN是完全随机变化的,如Linux 2.0以上的版本、OpenVMS和新版的AIX等。
DF检测:一些操作系统会在发送的数据包中设置IP头部DF(Don’t Fragment)位来改善性能。在某些系统中,如Solaris等,可以通过监视这个位来进行识别。
TCP初始化窗口大小:这种探测方法是对TCP连接建立时TCP包首部的窗口字段进行监视,因为很多操作系统的TCP初始化窗口的大小为常数。例如,Windows、FreeBSD及Open BSD系统的初始化窗口值为0x402E,AIX系统的初始化窗口值为0x3F25。
ACK确认号的值:操作系统接收到一些特别设计的TCP数据包时,响应数据包中ACK确认号的值会表现出一定规律。如果发送FIN、PSH、URG标志位都被设置为1的TCP数据包到关闭的端口,一些操作系统会将ACK确认号设置为所接收到的TCP数据包的ISN值,而Windows会将ACK确认号设置为ISN值加1。
TCP选项:TCP报文段首部结构中的选项域是可选的,并不是所有操作系统都支持。向目标主机发送包含选项信息的数据包,目标主机如果支持这些选项,将会在应答包中也进行相应的设置。如Nmap扫描软件通常会在扫描数据包中同时设置多个选项,从而提高检测的准确性。
ICMP差错报告报文统计:一些操作系统对ICMP差错报告报文的发送频率进行了限制。例如,Linux内核限制目的不可达报文每4s最多发送80个。通过某个随意选定的高位端口发送UDP包,可以统计出在某个给定时间段内接收到的不可达出错信息的数目,这样就可以计算出目标主机ICMP出错信息的发送频率,从而识别出操作系统类型。例如,Linux内核限制(在net/ipv4/ic-mp.h中定义)不可达消息的生成频率为20个/s。
ICMP消息引用:RFC中规定ICMP错误消息通常会引用一部分引起错误的源消息。当需要发送ICMP出错消息时,不同的操作系统引用源消息的信息量也各不相同。通过检测所引用的消息,可以粗略识别操作系统的类型。例如,对一个端口不可达的消息,大多数的操作系统只会返回IP请求头外加8B。然而,Solaris却会多返回一位,而Linux则会多返回更多位。这使得即使在没有开放端口的情况下,也可以区分Linux和Solaris操作系统。
TOS服务类型:对于ICMP端口不可达消息,多数操作系统返回包的服务类型值是0,而有些操作系统(如Linux)的返回值却是0xC0。
SYN洪泛限度:如果收到过多的伪造SYN数据包,一些操作系统会停止新的连接尝试。许多操作系统只能处理8个包。
TCP协议可选项:TCP首部包含可选项部分。这些可选项主要用于通信双方协商特殊的通信要求,增强了TCP协议通信的可靠性。